<?php
/**
 * 公用方法的类
 * jzzmly
 *
 */
class Libs_GlobalFunc{

	/**
        * 创建一个下拉列表
        * @param array $data 数组，以键值对的形式传递
        * @param string $id 表单ID
        * @param string $name 表单名称
        * @param string $default 默认值
        * @param mixed  $key 默认KEY
        * @param string $otherstr 其它字符串
        * @return htmlElement
        */
	public static function createSelectElement($data, $id='', $name='', $default='', $key=null, $otherstr='', $selectClass='') {
		$class = $selectClass ? ' class="' . $selectClass . '"' : '';
		$sel = '';
		$sel = '<select '.(($id) ? 'id="' . $id . '"' : '').' name="' . $name . '"' . $otherstr . ' ' . $class . '>';
		$sel .= $default ? '<option value="">' . $default . '</option>' : '';
		if ($data && is_array($data)) {
			foreach ($data as $k=>$v) {
				if (is_array($v)) {
					$k = $v['id'];
					$v = $v['name'];
				}
				$sel .= '<option value="' . $k . '" ';
				$sel .= ($key == $k && $key !== null) ? ' selected="selected"' : '';
				$sel .= '>' . $v . '</option>' . chr(10) . chr(13);
			}
		}
		$sel .= '</select>';
		return $sel;
	}
	
	/**
        * UTF8转GBK
        * 
        * @param string $str
        * @return string
        */
    public static function utf82gbk($str)
    {
        if (is_array($str)) {
            foreach ($str as &$row) {
                $row = self::utf82gbk($row);
            }
            return $str;
        }

        if (mb_check_encoding($str, 'UTF8')) {
            return iconv('UTF8','GBK', $str);
        } else if(mb_check_encoding($str, 'GBK')) {
            return $str;
        } else {
            return false;
        }
    }
    
    /**
        * GBK转UTF8
        * 
        * @param string $str
        * @return string
        */
    public static function gbk2utf8($str)
    {
        if (is_array($str)) {
            foreach ($str as &$row) {
                $row = self::gbk2utf8($row);
            }
            return $str;
        }

        if (mb_check_encoding($str, 'GBK')) {
            return iconv('GBK','UTF-8', $str);
        } else if(mb_check_encoding($str, 'UTF-8')) {
            return $str;
        } else {
            return false;
        }
    }
    
    /**
         * 递归建立文件目录
         * @param $filename 文件路径
         * @param $mod 权限值 默认为 0777
         */
    public static function checkFilePathExist($filename,$mod='0777')
    {
        $str = substr($filename,0,strrpos($filename,'/'));
        $fa = explode('/',$str);
        $faPath = '';
        for ($i=0;$i<sizeof($fa);$i++){
            $faPath .= $fa[$i];
            if (!is_dir($faPath) && $fa[$i]){
                mkdir($faPath,$mod);
                chmod($faPath,$mod);
            }
            $faPath .= '/';
        }
    }

    /**
         * 写文件函数
         *
         * @param $content 文件内容 
         * @param $fileName 文件路径
         * @param $writeType 写文件方式
        */
    public static function writeFile($content,$fileName,$writeType='w+'){
        self::checkFilePathExist($fileName);
        $fp = fopen($fileName,$writeType);
        //    flock($fp, 2);
        fputs($fp, $content);
        //    flock($fp, 3);
        fclose($fp);
        @chmod($fileName,0777);
    }
    
    /**
     * 公用分页程序
     * @author jzzmly
     * @param  $param
     * <pre>
     * page            当前页码数
     * pageSize        每页记录数
     * total           记录总数
     * baseUrl         基础url 例如：http://www.cnmo.com/aa_p
     * type            1 首页和其它页一致 2 首页特殊地址
     * indexUrl        特殊的首页地址,type为2时需要，为1时为空
     * fileExt         页面的后缀名 动态时为空即可，静态时如 .html
     * maxTotal        最大记录条数【防止一些超大limit start的出现】 默认为 5000  0为不限制
     * @return  string          分页字符串
     * </pre>
     */
    public static function multiPage(array $param)
    {
        if(!$param || !$param['total']){
            return '';
        }
        //init
        $page = intval($param['page']); //当前页码数
        $pageSize = intval($param['pageSize']); //当前页码数
        $resultsSum = intval($param['total']); //总记录数
        $baseUrl = trim($param['baseUrl']); //基础url http://www.cnmo.com/aa
        $indexUrl = trim($param['indexUrl']); //首页url用于首页特殊的页码显示
        $type = $param['type'] ? intval($param['type']) : 1; //分页的类型,默认为第一类
        $fileExt = trim($param['fileExt']); //url后缀名，默认为空
        $maxTotal = intval($param['maxTotal']); //限制最大记录数
        !$maxTotal && $maxTotal = 5000; //最大为5000
        $resultsSum = ($maxTotal<$resultsSum) ? $maxTotal : $resultsSum;
        //算出总页数
        $pagesum = ceil($resultsSum/$pageSize);
        //组合
        $pageStr = '';
        if(2 == $type){ //首页特别时
            //大于1页时加上一页的链接
            if ($page>1){
                if(1 == $page-1){
                    $pageStr.='<a target="_self" href="'.$indexUrl.'">&lt;上一页</a>';
                } else {
                    $pageStr.='<a target="_self" href="'.$baseUrl.($page-1).$fileExt.'">&lt;上一页</a>';
                }
            } else { //第一页时，显示一个灰色的上一页吧
                $pageStr.='<a target="_self" class="noprev">&lt;上一页</a>';
            }
            //先根据总页数进行分段处理
            if($pagesum <=5){ //5页以内时，直接全部显示
                for($i=1;$i<=$pagesum;$i++){
                    if($page == $i){
                        $pageStr.= '<span>'.$i.'</span>';
                    } else {
                        if(1 == $i){
                            $pageStr.= '<a target="_self" href="'.$indexUrl.'">1</a>';
                        } else {
                            $pageStr.= '<a target="_self" href="'.$baseUrl.$i.$fileExt.'">'.$i.'</a>';
                        }
                    }
                }
            } else if($pagesum>5){ //超过5页时
                if($page<5){ //前4页特殊处理，前面最多显示3个，后面显示一个，必然显示尾页，不显示首页
                    for($i=1;$i<=5;$i++){
                        if($page == $i){
                            $pageStr.= '<span>'.$i.'</span>';
                        } else {
                            if(1 == $i){
                                $pageStr.= '<a target="_self" href="'.$indexUrl.'">1</a>';
                            } else {
                                $pageStr.= '<a target="_self" href="'.$baseUrl.$i.$fileExt.'">'.$i.'</a>';
                            }
                        }
                    }
                    //得到尾页
                    $pageStr.='...<a target="_self" href="'.$baseUrl.$pagesum.$fileExt.'">'.$pagesum.'</a>';

                } else if($page>=5  && $page<$pagesum-3){ //如果页数>=5 && <$pagesum-3 时正常显示，有头有尾
                    //得到首页
                    $pageStr.='<a target="_self" href="'.$baseUrl.'1'.$fileExt.'">1</a>...';
                    $j = 0;
                    while($j<$pagesum){
                        $j++;
                        if($j<($page-2) && ($pagesum-$j)>4) continue;
                        elseif ($j>($page+2) && $j>5) break;
                        elseif ($j == $page) $pageStr.= '<span>'.$j.'</span>';
                        else {
                            if(1 == $j){
                                $pageStr.= '<a target="_self" href="'.$indexUrl.'">1</a>';
                            } else {
                                $pageStr.= '<a target="_self" href="'.$baseUrl.$j.$fileExt.'">'.$j.'</a>';
                            }
                        }
                    }
                    //得到尾页
                    $pageStr.='...<a target="_self" href="'.$baseUrl.$pagesum.$fileExt.'">'.$pagesum.'</a>';
                } else { //必然不显示尾页，后面最多显示3个，前面显示1个，显示首页
                    //得到首页
                    $pageStr.='<a target="_self" href="'.$baseUrl.'1'.$fileExt.'">1</a>...';
                    for($i=$pagesum-4;$i<=$pagesum;$i++){
                        if($page == $i){
                            $pageStr.= '<span>'.$i.'</span>';
                        } else {
                            if(1 == $i){
                                $pageStr.= '<a target="_self" href="'.$indexUrl.'">1</a>';
                            } else {
                                $pageStr.= '<a target="_self" href="'.$baseUrl.$i.$fileExt.'">'.$i.'</a>';
                            }
                        }
                    }
                }
            }
            //总页数大于1，最后一页之前显示下一页
            if ($page<$pagesum && $pagesum>1) {
                $pageStr.='<a target="_self" href="'.$baseUrl.($page+1).$fileExt.'" class="prev">下一页&gt;</a>';
            }
            if($page == $pagesum){ //最后一页，显示灰色的下一页
                $pageStr.='<a target="_self" class="nonext">下一页&gt;</a>';
            }

        } else { //全部一致时
            //大于1页时加上一页的链接
            if ($page>1){
                $pageStr.='<a target="_self" class="prev" href="'.$baseUrl.($page-1).$fileExt.'">&lt;上一页</a>';
            } else { //第一页时，显示一个灰色的上一页吧
                $pageStr.='<a target="_self" class="noprev">&lt;上一页</a>';
            }
            //先根据总页数进行分段处理
            if($pagesum <=5){ //5页以内时，直接全部显示
                for($i=1;$i<=$pagesum;$i++){
                    if($page == $i){
                        $pageStr.= '<span>'.$i.'</span>';
                    } else {
                        $pageStr.= '<a target="_self" href="'.$baseUrl.$i.$fileExt.'">'.$i.'</a>';
                    }
                }
            } else if($pagesum>5){ //超过5页时
                if($page<5){ //前4页特殊处理，前面最多显示3个，后面显示一个，必然显示尾页，不显示首页
                    for($i=1;$i<=5;$i++){
                        if($page == $i){
                            $pageStr.= '<span>'.$i.'</span>';
                        } else {
                            $pageStr.= '<a target="_self" href="'.$baseUrl.$i.$fileExt.'">'.$i.'</a>';
                        }
                    }
                    //得到尾页
                    $pageStr.='...<a target="_self" href="'.$baseUrl.$pagesum.$fileExt.'">'.$pagesum.'</a>';

                } else if($page>=5  && $page<$pagesum-3){ //如果页数>=5 && <$pagesum-3 时正常显示，有头有尾
                    //得到首页
                    $pageStr.='<a target="_self" href="'.$baseUrl.'1'.$fileExt.'">1</a>...';
                    $j = 0;
                    while($j<$pagesum){
                        $j++;
                        if($j<($page-2) && ($pagesum-$j)>4) continue;
                        elseif ($j>($page+2) && $j>5) break;
                        elseif ($j == $page) $pageStr.= '<span>'.$j.'</span>';
                        else {
                            $pageStr.= '<a target="_self" href="'.$baseUrl.$j.$fileExt.'">'.$j.'</a>';
                        }
                    }
                    //得到尾页
                    $pageStr.='...<a target="_self" href="'.$baseUrl.$pagesum.$fileExt.'">'.$pagesum.'</a>';
                } else { //必然不显示尾页，后面最多显示3个，前面显示1个，显示首页
                    //得到首页
                    $pageStr.='<a target="_self" href="'.$baseUrl.'1'.$fileExt.'">1</a>...';
                    for($i=$pagesum-4;$i<=$pagesum;$i++){
                        if($page == $i){
                            $pageStr.= '<span>'.$i.'</span>';
                        } else {
                            $pageStr.= '<a target="_self" href="'.$baseUrl.$i.$fileExt.'">'.$i.'</a>';
                        }
                    }
                }
            }
            //总页数大于1，最后一页之前显示下一页
            if ($page<$pagesum && $pagesum>1) {
                $pageStr.='<a target="_self" href="'.$baseUrl.($page+1).$fileExt.'" class="prev">下一页&gt;</a>';
            }
            if($page == $pagesum){ //最后一页，显示灰色的下一页
                $pageStr.='<a target="_self" class="nonext">下一页&gt;</a>';
            }
        }
        return $pageStr;
    }
    
     /**
     * 简单分页的分页函数，下一页和下一页两个按钮
     * @author jzzmly
     * @param  $param
     * <pre>
     * page            当前页码数
     * pageSize        每页记录数
     * total           记录总数
     * baseUrl         基础url 例如：http://www.cnmo.com/aa_p
     * type            1 首页和其它页一致 2 首页特殊地址
     * indexUrl        特殊的首页地址,type为2时需要，为1时为空
     * fileExt         页面的后缀名 动态时为空即可，静态时如 .html
     * maxTotal        最大记录条数【防止一些超大limit start的出现】 默认为 5000  0为不限制
     * @return  string          分页字符串
     * </pre>
     */
    public static function simplePage(array $param)
    {
        if(!$param || !$param['total']){
            return '';
        }
        //init
        $page = intval($param['page']); //当前页码数
        $pageSize = intval($param['pageSize']); //当前页码数
        $resultsSum = intval($param['total']); //总记录数
        $baseUrl = trim($param['baseUrl']); //基础url http://www.cnmo.com/aa
        $indexUrl = trim($param['indexUrl']); //首页url用于首页特殊的页码显示
        $type = $param['type'] ? intval($param['type']) : 1; //分页的类型,默认为第一类
        $fileExt = trim($param['fileExt']); //url后缀名，默认为空
        $maxTotal = intval($param['maxTotal']);
        !$maxTotal && $maxTotal = 5000; //最大记录数限为5000
        $resultsSum = ($maxTotal<$resultsSum) ? $maxTotal : $resultsSum;
        //算出总页数
        $pagesum = ceil($resultsSum/$pageSize);
        //组合
        $pageStr = '';
        //总量
        $pageStr = $page.'/'.$pagesum;

        if(2 == $type){ //首页不同时
            if($pagesum>1){ //多于一页时再看吧
                $pageStr .= '&nbsp;';
                if($page-1){ //上一页
                    if(1 == $page-1){
                        $pageStr.= '<a target="_self" href="'.$indexUrl.'">上一页</a>';
                    } else {
                        $pageStr.= '<a target="_self" href="'.$baseUrl.($page-1).$fileExt.'">上一页</a>';
                    }
                } else { //没有上一页了
                    $pageStr.= '<a target="_self" class="prev">上一页</a>';
                }
                if($page+1>$pagesum){ //没有下一页了
                    $pageStr.= '<a target="_self" class="end">下一页</a>';
                } else { //下一页
                    $pageStr.= '<a target="_self" class="next" href="'.$baseUrl.($page+1).$fileExt.'">下一页</a>';
                }
            }
        } else { //首页相同时
            if($pagesum>1){ //多于一页时再看吧
                $pageStr .= '&nbsp;';
                if($page-1){ //上一页
                    $pageStr.= '<a target="_self" href="'.$baseUrl.($page-1).$fileExt.'">上一页</a>';
                } else { //没有上一页了
                    $pageStr.= '<a target="_self" class="prev">上一页</a>';
                }
                if($page+1>$pagesum){ //没有下一页了
                    $pageStr.= '<a target="_self" class="end">下一页</a>';
                } else { //下一页
                    $pageStr.= '<a target="_self" class="next" href="'.$baseUrl.($page+1).$fileExt.'">下一页</a>';
                }
            }
        }
        if(1 == $pagesum){ //显示灰化的上一页和下一页
            $pageStr .= '<a target="_self" class="prev">上一页</a><a target="_self" class="end">下一页</a>';
        }
        return $pageStr;
    }
}